package com.autism.thread.suo;

/**
 * 生产者：包子铺，线程类，可以继承Thread
 * <p>
 * 设置线程任务（run）：生产包子
 * <p>
 * 对包子状态进行判断
 * true：有包子，调用wait方法
 * <p>
 * false：没有包子，生产包子，修改包子状态为true，唤醒吃货线程，让吃货吃包子
 * <p>
 * 注意
 * 包子线程和包子铺线程关系  ===》 通信（互斥），必须使用同步技术保证两个线程只能有一个在执行
 * 锁对象必须保证唯一，可以使用包子对象作为锁对象，包子铺和吃货的类需要把包子对象作为参数传递进来
 * 1.需要在成员位置创建一个包子变量
 * 2.使用带参构造方法为包子变量赋值
 */
public class BaoZiStore extends Thread {

    //创建包子变量
    private BaoZi baoZi;

    //构造赋值
    public BaoZiStore(BaoZi baoZi) {
        this.baoZi = baoZi;
    }

    //设置线程任务，生产包子
    @Override
    public void run() {
        int count = 0;

        while (true) {
            //同步锁
            synchronized (baoZi) {
                if (baoZi.hasBaoZi) {
                    try {
                        baoZi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //被唤醒之后执行
                if (count % 2 == 0) {
                    //生产薄皮  三鲜馅
                    baoZi.pi = "薄皮";
                    baoZi.xian = "三鲜馅";
                } else {
                    //冰皮 牛肉馅
                    baoZi.pi = "冰皮";
                    baoZi.xian = "牛肉馅";
                }

                count++;
                System.out.println("包子铺正在生产" + baoZi.pi + baoZi.xian + "包子");

                //生产所需时间
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //修改包子状态
                baoZi.hasBaoZi = true;
                baoZi.notify();
                System.out.println("包子铺已经生产" + baoZi.pi + baoZi.xian + "包子，可以吃了");
            }
        }

    }
}
